#include <iostream>
#include <string>
#include <vector>

/**
 * 将字符串按指定分隔符分割成多个子串
 * @param str 待分割的原始字符串
 * @param sep 分隔符字符串
 * @param result 存储分割结果的向量
 * @return 分割出的子串数量
 */
size_t split(const std::string &str, const std::string &sep, std::vector<std::string> &result) {
    // 示例: str = "...news....music.#.pop...", sep = "."
    
    // idx: 当前查找的起始位置
    size_t pos, idx = 0;
    
    // 循环直到处理完整个字符串
    while(idx < str.size()) {
        // 从idx位置开始查找分隔符sep的第一次出现
        pos = str.find(sep, idx);
        
        // 情况1: 未找到分隔符，将剩余部分作为最后一个子串
        if (pos == std::string::npos) {
            result.push_back(str.substr(idx)); // 截取从idx到末尾的子串
            return result.size(); // 返回分割结果的数量
        }
        
        // 情况2: 分隔符出现在查找起始位置
        // 例如: 原始字符串以分隔符开头，或两个分隔符相邻
        if (pos == idx) {
            idx = pos + sep.size(); // 跳过当前分隔符，继续查找
            continue;
        }
        
        // 情况3: 找到有效分隔符，且不在起始位置
        // 截取从idx到pos之间的子串(不包含sep)
        result.push_back(str.substr(idx, pos - idx));
        
        // 更新查找起始位置，跳过已处理的分隔符
        idx = pos + sep.size();
    }
    
    return result.size();
}

int main()
{
    std::string str = "...news....music.#.pop...";
    std::vector<std::string> arry;
    
    // 调用分割函数
    int n = split(str, ".", arry);
    
    // 输出分割结果
    std::cout << "分割结果(" << n << "个):" << std::endl;
    for (auto &s : arry) {
        std::cout << "[" << s << "]" << std::endl;
    }
    
    return 0;
}    